import axios from 'axios'
import qs from 'qs'
import router, { resetRouter } from '@/router'
import { getToken, TOKEN_KEY, removeToken, localRemove } from '@/libs/util'

import { Modal, Message } from 'view-design'

class HttpRequest {
  constructor (baseUrl = baseURL) {
    this.baseUrl = baseUrl
  }
  getInsideConfig () {
    const config = {
      baseURL: this.baseUrl,
      timeout: 10000, // 请求超时的时间，默认设置为10s
      headers: {
        // 可以自定义一些公共的请求头
      }
    }
    return config
  }
  interceptors (instance) {
    // 请求拦截器
    instance.interceptors.request.use(config => {
      if (getToken()) {
        // 每个请求头部都添加上token
        config.headers[TOKEN_KEY] = getToken()
      }
      // 如果是get请求的话，则拼接上时间戳，防止浏览器缓存
      if (config.method === 'get') {
        if (config.url.indexOf('?') === -1) {
          config.url = config.url + '?t=' + new Date().getTime()
        } else {
          config.url = config.url + '&t=' + new Date().getTime()
        }
      }
      // 如果是post请求的话，则根据请求头自动转换请求格式
      else if (config.method === 'post') {
        let contentType = config.headers['Content-Type']
        console.log('Content-Type = ' + contentType)
        if (typeof contentType === 'undefined' || contentType == null || contentType === '') {
          contentType = 'application/x-www-form-urlencoded; charset=UTF-8'
          config.headers['Content-Type'] = contentType
        }
        // 判断Content-Type的类型，自动转换参数类型，application/x-www-form-urlencoded; charset=UTF-8
        if (contentType.indexOf('application/x-www-form-urlencoded') >= 0) {
          config.data = qs.stringify(config.data)
        } else if (contentType.indexOf('application/json') >= 0) {
          config.data = JSON.stringify(config.data)
        }
      }

      return config
    }, error => {
      console.log(error)
      return Promise.reject(error)
    })
    // 响应拦截器
    instance.interceptors.response.use(response => {
      const status = response.status
      const res = response.data
      if ((status >= 200 && status < 300) || status === 304) {
        // 返回结果不是0，说明后台出错了
        if (res.code !== 0) {
          // 401: 未登录
          if (res.code === 401 || res.code === 402) {
            Modal.confirm({
              title: '提示',
              content: res.code === 401 ? '会话已失效，是否重新登录？' : '此账号已在其他地方登录，请重新登录！',
              onOk: () => {
                // 清除cookie，重新回到登陆页面
                removeToken()
                localRemove('tagNaveList')
                resetRouter() // 重置路由
                router.push({ name: 'login' })
                // location.reload();
              },
              onCancel: () => {

              }
            })
          } else {
            Message.error({
              content: res.message || 'Error',
              duration: 5
            })
          }
          // 失败的话，也则直接返回结果，因为页面可能会有一些自定义逻辑需要自己处理
          const { data, status } = response
          return { data, status }
        } else {
          // 成功返回结果，弹出提示信息之类的交予页面自己处理(因为页面可能会有自定义逻辑)
          const { data, status } = response
          return { data, status }
        }
      } else {
        return Promise.reject(response)
      }
    }, error => {
      if (error.response) {
        if (error.response.status === 500) {
          Message.error({
            content: '系统出错，请联系系统管理员!',
            duration: 4
          })
        } else if (error.response.status === 404) {
          Message.error({
            content: '网络请求不存在!',
            duration: 4
          })
        } else {
          Message.error({
            content: error.response.data.error,
            duration: 4
          })
        }
      } else {
        // 请求超时或者网络有问题
        if (error.message.includes('timeout')) {
          Message.error('请求超时！请检查网络是否正常')
        } else {
          Message.error('请求失败，请检查网络是否已连接')
        }
      }

      return Promise.reject(error)
    })
  }
  request (options) {
    const instance = axios.create()
    options = Object.assign(this.getInsideConfig(), options)
    this.interceptors(instance)
    return instance(options)
  }
}
export default HttpRequest
